</> 技術筆記Tech Notes

細說 JavaScript 物件:從基礎到設計模式

ㄧ、前言

物件(Object)是 JavaScript 的核心概念之一。不僅是資料的容器,更是建構複雜應用程式的重要基礎。本文將從基礎觀念出發,逐步深入探討 JavaScript 物件的建立方式、屬性操作,以及常見的設計模式。

二、基本觀念

在 JavaScript 中,物件由一系列的「鍵-值」(key-value)配對組成,每一個鍵值對稱為「屬性」(property)。屬性的值可以是任何資料型態,包括數字、字串、陣列,甚至是另一個物件或函式。

三、基本範例

以下是一個簡單的物件範例:

var person = {
  firstName: "Leo",
  lastName: "Shiang",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

console.log(person.fullName()); // Leo Shiang

四、建立物件的方法

4.1 物件字面量 (Object Literal)

最簡單且常用的方式。

var book = {
  title: 'Beauty of JavaScript',
  isbn: '978-986-347-859-1',
  price: 400,
  displayTitle: function() {
    console.log(this.title);
  }
};

book.displayTitle(); // Beauty of JavaScript

4.2 使用建構式 (Constructor)

使用 new Object() 建立物件,然後逐一加入屬性和方法。

var book = new Object();
book.title = 'Beauty of JavaScript';
book.isbn = '978-986-347-859-1';
book.price = 400;
book.displayTitle = function() {
  console.log(this.title);
};

book.displayTitle(); // Beauty of JavaScript

4.3 建構函式 (Constructor Function)

透過自訂建構函式建立具有共同屬性及方法的物件。

function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
  this.fullName = function() {
    return this.firstName + " " + this.lastName;
  };
}

var me = new Person("Leo", "Shiang");
console.log(me.fullName()); // Leo Shiang

4.4 使用 Object.create()

這種方式允許指定原型。

無原型範例

var person = Object.create(null);
person.name = "Leo";

console.log(typeof person); // object
console.log(person.prototype); // undefined

有原型範例

var prototypeObject = {
  fullName: function() {
    return this.firstName + ' ' + this.lastName;
  }
};

var person = Object.create(prototypeObject);
person.firstName = 'Leo';
person.lastName = 'Shiang';

console.log(person.fullName()); // Leo Shiang

4.5 工廠模式 (Factory Pattern)

透過函式建立並回傳新物件。

function createBook(title, isbn, price) {
  var book = new Object();
  book.title = title;
  book.isbn = isbn;
  book.price = price;
  book.displayTitle = function() {
    console.log(this.title);
  };
  return book;
}

var book = createBook('Beauty of JavaScript', '978-986-347-859-1', 400);
book.displayTitle(); // Beauty of JavaScript

五、操作物件屬性

5.1 屬性存取方式

  • 點記法 (dot notation)

person.firstName;
person.fullName();
  • 中括號記法 (bracket notation)

適用於鍵名為特殊字元或變數。

var person = {};
person["weight"] = 80;

var key = "firstName";
person[key] = "Leo";

5.2 刪除屬性

使用 delete

delete person.firstName;

5.3 列舉物件屬性

  • Object.keys():回傳物件自身可列舉屬性。

console.log(Object.keys(person));
  • for...in 迴圈:遍歷物件與原型鏈可列舉屬性。

for (var property in person) {
  console.log(property);
}
  • Object.getOwnPropertyNames():回傳物件自身所有屬性(含不可列舉)。

console.log(Object.getOwnPropertyNames(person));

六、設計模式:原型模式 (Prototype Pattern)

6.1 核心概念

在 JavaScript 中,每個函式都有 prototype 屬性,包含可被實例共享的屬性和方法。

範例

function Book() {}
Book.prototype.title = 'Beauty of JavaScript';
Book.prototype.displayTitle = function () {
  console.log(this.title);
};

var book1 = new Book();
var book2 = new Book();

book1.displayTitle(); // Beauty of JavaScript
console.log(book1.displayTitle === book2.displayTitle); // true

6.2 結合建構函式與原型模式

  • 建構函式:定義每個實例獨有的屬性。

  • 原型模式:定義共享的方法和屬性。

function Task(name, start, end) {
  this.name = name;
  this.start = new Date(start);
  this.end = new Date(end);
  this.subTasks = [];
}

Task.prototype.getDuration = function() {
  return this.end - this.start;
};

var task1 = new Task('需求訪談', '2018-10-23', '2018-10-30');
var task2 = new Task('系統設計', '2018-11-01', '2018-11-12');

console.log(task1.getDuration === task2.getDuration); // true

七、結論

從物件字面量到原型繼承,JavaScript 提供豐富多樣的物件操作方式。掌握這些方法與設計模式,將有助於提升你的 JavaScript 開發能力。